Cloud Functions for Firebase(Python)でFirestoreにあるデータを取得してみた
こんにちは、ゲームソリューション部のsoraです。
今回は、Cloud Functions for Firebase(Python)でFirestoreにあるデータを取得してみたことについて書いていきます。
Firebase SDKを使ったFlutterでのリクエストではなく、HTTPリクエストで取得します。
個人的につまづいたポイントがあったため、そのポイントについては最後に記載します。
Firestoreにてデータベースの作成
まずはFirebaseのドキュメントDBであるFirestoreを作成します。
DB名は(default)
のままで、リージョンは作成予定のFunctionsと同じasia-northeast1(Tokyo)
にします。
モードはテスト用でそのまま接続できるようにしたいため、テストモードにしました。
Firestoreでは、DBの中にコレクションがあって、その配下にドキュメントをあります。
ドキュメントの配下には(サブ)コレクションとフィールドを追加することができます。
コレクション>ドキュメント>フィールド
やコレクション>ドキュメント>サブコレクション>ドキュメント>フィールド
みたいな構成になります。
今回登録したデータは以下です。
コードの解説
コードは以下です。
先ほど作成したFirestoreのusersコレクションのデータを取得するコードになっています。
リージョンはasia-northeast1(Tokyo)
にしています。
解説はコメント内に記述しています。
今回はget()
していますが、set()
やdelete()
なども可能です。
import json from firebase_functions import https_fn, options from firebase_admin import initialize_app, firestore # 新しいAppインスタンスを初期化 initialize_app() # リージョンの指定 options.set_global_options(region=options.SupportedRegion.ASIA_NORTHEAST1) @https_fn.on_request() def test_firestore(req: https_fn.Request) -> https_fn.Response: db = firestore.client() # Firestoreからデータの取得 # .document('documentName')を追記してドキュメント内のデータ取得も可能 # オブジェクトレベルで指定しての取得は不可 chat_count = db.collection('users') docs = chat_count.get() # docsをそのままreturnするとエラーになるため、辞書型へ変換する users_list = [] for doc in docs: users_list.append(doc.to_dict()) # ASCII エンコード以外の文字列をエスケープせずにそのまま出力 users_documents = json.dumps({"users": users_list}, ensure_ascii=False) return users_documents
デプロイ・実行確認
コードが完成したためデプロイします。
今回はFunctionsをローカルで実行していますが、Firebaseへのデプロイをしても同様に動作すると思います。
# ローカルで実行 firebase serve --only functions:test_firestore # デプロイする場合 firebase deploy --only functions:test_firestore
コマンド実行時に表示されるURLにアクセスすると、以下のようにFirestoreに登録したusers
コレクションのデータが表示できました。
個人的に詰まったこと
Firestoreにてデータベースを作成時に、データベース名を(default)
ではなく別名にしてみたところ、データベースの指定が上手くできずに接続できませんでした。
色々調べたり試行錯誤してみたものの接続できなかったため、別名で利用したくなった時はまた調べてみようと思います。(できなくはないと思うため)
ちなみに、Firebaseにて無料割り当ての対象となるのは、データベース名が(default)
の場合のみです。
使用量と上限 | Firestore | Firebase
最後に
今回は、Cloud Functions for Firebase(Python)でFirestoreにあるデータを取得してみたことを記事にしました。
どなたかの参考になると幸いです。